//
//  NoteManager.swift
//  SwiftToDoList
//
//  Created by 谢志敏 on 2025/7/8.
//

import Foundation
import CoreData
// swift中class可以独立成类也可以继承OC中的类来进行声明
// 既然如此那这种情况则不会继承任何方法和属性

// 继承中final以及private这两个关键字是无法让子类继承属性或者方法
// 在swift中需要继承NSObject只见于混编或者正在改造路上的项目代码Cocoa框架交换

// 不需要显示初始化器的情况： 类的所有存储属性都具备默认值，swift这种情况会默认生成一个默认的初始化器
// 需要显示初始化的情况: 嘞中存在没有美容嗯知的存储属性，必须实现一个或多个初始化器

// 初始化器包含两种初始化器 1.指定初始化器 2.便利初始化器
// 便利初始化器最终指向的是指定初始化器
class NoteManager {
    
    static func createNote(title: String, content: String, category: Category?) -> Note {
        let context = CoreDataManager.shared.context
        let newNote = Note(context: context)
        
        newNote.id = UUID()
        newNote.title = title
        newNote.content = content
        newNote.createdAt = Date()
        newNote.updatedAt = Date()
        newNote.isPinned = false
        newNote.category = category
        
        CoreDataManager.shared.saveContext()
        return newNote
    }
    
    
//    获取所有数据库中的数据
    static func fetchAllNotes() -> [Note] {
        let context = CoreDataManager.shared.context
        let request: NSFetchRequest<Note> = Note.fetchRequest()
        let sortDescriptor = NSSortDescriptor(key: "updatedAt", ascending: false)
        request.sortDescriptors = [sortDescriptor]
        
        do {
            return try context.fetch(request)
        } catch {
            print("获取笔记失败： \(error)")
            return []
        }
     }
    
    static func updateNote(note: Note, newTitle: String, newContent: String) {
        note.title = newTitle
        note.content = newContent
        note.updatedAt = Date()
        CoreDataManager.shared.saveContext()
    }
    
    static func deleteNote(note: Note) {
        let context = CoreDataManager.shared.context
        context.delete(note)
        CoreDataManager.shared.saveContext()
    }
    
    static func searchNotes(with text: String) -> [Note] {
        let context = CoreDataManager.shared.context
        let request: NSFetchRequest<Note> = Note.fetchRequest()
        
        let titltPredicate = NSPredicate(format: "title CONTAINS[cd] %@", text)
        let contentPredicate = NSPredicate(format: "content CONTAINS[cd] %@", text)
        request.predicate = NSCompoundPredicate(orPredicateWithSubpredicates: [titltPredicate, contentPredicate])
        
        
        do {
            return try context.fetch(request)
        } catch {
            print("搜索失败： \(error)")
            return []
        }
    }
    
}
